public class CCuenta {

    private String nombre, cuenta;
    private double saldo, tipoDeInteres;
    static double totalSaldo=0;
    /**
     * @brief Constructor por defecto
     */
    public CCuenta(){System.out.println("\nObjeto CCuenta creado.");} //Constructor predeterminado
    
    /**
     * @brief Constructor con parámetros
     * @param nom Nombre del cliente
     * @param c Número de la cuenta
     * @param sal Saldo inicial de la cuenta
     * @param tipo Tipo que se le aplica a la cuenta %
     */
    public CCuenta(String nom, String c, double sal, double tipo){ //Constructor con parámetros
        asignarNombre(nom);
        asignarCuenta(c);
        realizarIngreso(sal);
        asignarTipoInteres(tipo);
    }
    /**
     * 
     * @param nom Asigna el nombre del cliente
     */
    public void asignarNombre(String nom){
        if(nom.length() == 0){
            System.out.println("\nERROR: cadena vacia");
            return;
        }
        nombre = nom;
    }
    /**
     * 
     * @param c Asigna el número de la cuenta
     */
    public void asignarCuenta(String c){
        if(c.length() == 0){
            System.out.println("\nERROR: cuenta vacia");
            return;
        }
        cuenta = c;
    }
    /**
     * 
     * @param tipo Asigna el tipo de interés que se le aplica a la cuenta
     */
    public void asignarTipoInteres(double tipo){
        if(tipo < 0){
            System.out.println("\nERROR: tipo de interes negativo");
            return;
        }
        tipoDeInteres = tipo;
    }
    /**
     * 
     * @return Devuelve el nombre del cliente
     */
    public String obtenerNombre(){
        return nombre;
    }
    /**
     * 
     * @return Devuelve el número de la cuenta
     */
    public String obtenerCuenta(){
        return cuenta;
    }
    /**
     * 
     * @return Devuelve el tipo de interés de la cuenta
     */
    public double obtenerTipoInteres(){
        return tipoDeInteres;
    }
    /**
     * 
     * @return Devuelve el saldo actual de la cuenta
     */
    public double obtenerSaldo(){
        return saldo;
    }
    
    /**
     * 
     * @param cantidad Cantidad que se va a ingresar en la cuenta
     */
    public void realizarIngreso(double cantidad){
        if(cantidad < 0){
            System.err.println("\nERROR: cantidad negativa");
        }
        saldo = saldo + cantidad;
        SaldoTotal(cantidad,true);
    }
    
    /**
     * 
     * @param cantidad Cantidad que se va a restar de la cuenta
     */
    public void realizarReintegro(double cantidad){
        if(saldo - cantidad < 0){
            System.err.println("\nERROR: saldo insuficiente");
        }
        saldo = saldo - cantidad;
        SaldoTotal(cantidad,false);
    }
    
    /**
     * Comprueba que el dinero a reintegrar no deja en saldo negativo la cuenta
     * @param dinero Cantidad que se va a sacar/meter
     * @param incremento <code>True</code> si se va a meter dinero en la cuenta y  
     * <code>false</code> si se va a sacar dinero
     */
    public void SaldoTotal(double dinero, boolean incremento){
        if(incremento == true){totalSaldo = totalSaldo + dinero;}
        else{totalSaldo = totalSaldo - dinero;}
    }
    
    /**
     * 
     * @return Devuelve el saldo con el incremento o decremento
     */
    public double getSaldoTotal(){
        return totalSaldo;
    }
    /**
     * 
     * @param cuentaDestino Cuenta en la que se va a ingresar el dinero
     * @param importe Cantidad que se va a transferir
     */
    public void transferir(CCuenta cuentaDestino, double importe){
        realizarReintegro(importe);
        cuentaDestino.realizarIngreso(importe);
    }
}